home *** CD-ROM | disk | FTP | other *** search
- {
- Here is a fast polygon fill I wrote in an hour. It requires that the polygon
- is convex, and the verticies are in sequential order. Right now, the verticies
- must be in counter clockwise rotation, but that can be changed by removing
- the conditional statement in the HLine procedure. It handles an arbitrary
- number of verticies.
-
- achalfin@uceng.uc.edu
- }
-
- Procedure HLine(X1, X2, Y : Integer; Color : Byte);
- { Fill using words to speed up alot! }
-
- Label Offscreen;
-
- Begin
- If Y < 0 Then Goto Offscreen;
- If Y > 199 Then Goto Offscreen;
- If X2 > X1
- Then Begin
- If X1 < 0 Then X1 := 0;
- If X2 > 319 Then X2 := 319;
- FillChar(Mem[$A000:Y*320+X1], X2-X1+1, Color);
- End;
- OffScreen:
- End;
-
- Procedure FillPoly(P:MappedCoords; Num : Word; Color : Byte);
- { Mapped Coords is an array of (x, y) coords, each is an integer }
-
- Var
- x1, y1, x2, y2, x11, y11, x22, y22 : Integer;
- StartV1, EndV1, StartV2, EndV2 : Integer;
- Dx1, Dx2, Count1, Count2 : Integer;
- XVal1, XVal2 : Longint;
- EdgeCount, MinY : Word;
- C : Integer;
-
- Begin
- EdgeCount := Num;
- MinY := 300;
- For C := 0 to (EdgeCount-1) do { Find Top Vertex }
- Begin
- If P[c].Y < MinY
- Then Begin MinY := P[c].Y; StartV1 := C; End;
- End;
- StartV2 := StartV1;
- EndV1 := StartV1 - 1;
- EndV2 := StartV2 + 1;
- If EndV1 < 0 Then EndV1 := (Num-1);
- If EndV2 >= Num Then EndV2 := 0;
- MinY := P[StartV1].Y;
- X1:=P[StartV1].X; Y1:=P[StartV1].Y; X2:=P[EndV1].X; Y2:=P[EndV1].Y;
- Dx1 := ((X2 - X1) Shl 8) Div (Y2 - Y1 + 1);
- Count1 := Y2-Y1; XVal1 := Longint(X1) Shl 8;
- X11:=P[StartV2].X; Y11:=P[StartV2].Y; X22:=P[EndV2].X; Y22:=P[EndV2].Y;
- Dx2 := ((X22 - X11) Shl 8) Div (Y22 - Y11 + 1);
- Count2 := Y22-Y11; XVal2 := Longint(X11) Shl 8;
- While EdgeCount > 1 do
- Begin
- While (Count1 > 0) and (Count2 > 0) do
- Begin
- HLine(XVal1 Shr 8, XVal2 Shr 8, MinY, Color);
- XVal1 := XVal1 + Dx1; XVal2 := XVal2 + Dx2;
- Count1 := Count1 - 1; Count2 := Count2 - 1;
- MinY := MinY + 1;
- End;
- If Count1 = 0
- Then Begin
- StartV1 := EndV1; EndV1 := EndV1 - 1;
- If EndV1 < 0 Then EndV1 := (Num-1);
- EdgeCount := EdgeCount - 1; MinY := P[StartV1].Y;
- X1 := P[StartV1].X; Y1 := P[StartV1].Y;
- X2 := P[EndV1].X; Y2 := P[EndV1].Y;
- Dx1 := ((X2 - X1) Shl 8) Div (Abs(Y2 - Y1) + 1);
- Count1 := Y2-Y1; XVal1 := Longint(X1) Shl 8;
- End;
- If Count2 = 0
- Then Begin
- StartV2 := EndV2; EndV2 := EndV2 + 1;
- If EndV2 >= Num Then EndV2 := 0;
- EdgeCount := EdgeCount - 1; MinY := P[StartV2].Y;
- X11 := P[StartV2].X; Y11 := P[StartV2].Y;
- X22 := P[EndV2].X; Y22 := P[EndV2].Y;
- Dx2 := ((X22 - X11) Shl 8) Div (Abs(Y22 - Y11) + 1);
- Count2 := Y22-Y11; XVal2 := Longint(X11) Shl 8;
- End;
- End;
- End;
-